package cn.itcast.up.common.mytest

import java.io.{File, FileOutputStream}
import java.util.Properties

import cn.itcast.up.common.HDFSUtils
import org.apache.oozie.client.OozieClient

/**
 * 自己实现作业提交到Oozie.
 */
object MyOozieUtils {
  //先获取一个类的加载器
  //用我们自己的类,获取到它的字节码对象.之后就可以获取类的加载器.
  private val loader: ClassLoader = MyOozieUtils.getClass.getClassLoader

  def main(args: Array[String]): Unit = {
    //构建Properties,让Oozie使用.
    val props = new Properties()
    //向props中添加参数
    //开始时间/结束时间/运行频次/主类名/jar路径/模型的ID(为了每个模型都有自己的工作目录)
    props.setProperty("start", "2019-09-24T06:15+0800")
    props.setProperty("end", "2030-09-30T06:15+0800")
    props.setProperty("mainClass", "cn.itcast.up29.TestTag")
    props.setProperty("jarPath", "hdfs://bd001:8020/apps/tags/models/Tag_001/lib/model29.jar")
    //单独指定的字段.
    props.setProperty("modelID", "35")

    //将用户自己填写的信息和UpHolder中的配置进行合并.
    //获取up.conf配置文件中的oozie数据
    val params: Map[String, String] = UpHolder.oozie.params
    //遍历params,将取出的数据都交给上面的props
    for ((k, v) <- params){
      props.setProperty(k, v)
    }
    //将应用目录信息构建出来
    //获取props里面的模型ID
    val modelID: String = props.getProperty("modelID")
    val appPath = "/apps/tags_new/models/tags_" + modelID
    //创建应用目录
    HDFSUtils.getInstance().mkdir(appPath)
    //补充信息
    props.setProperty("appPath", "hdfs://bd001:8020" + appPath)
    //设置coordinatePath
    props.setProperty(OozieClient.COORDINATOR_APP_PATH, "hdfs://bd001:8020" + appPath)

    //如果所有的配置已经添加完毕,将所有的配置文件,上传到HDFS.
    //上传的时候,需要有本地文件的路径,我们可以使用类的加载器来获取路径.
    //获取配置文件的本地路径
    val workflowPath: String = loader.getResource("oozie/workflow.xml").getPath
    val coordinatorPath: String = loader.getResource("oozie/coordinator.xml").getPath
    val propertiesPath: String = loader.getResource("oozie/job.properties").getPath
    //上传文件
    HDFSUtils.getInstance().copyFromFile(workflowPath, appPath + "/workflow.xml")
    HDFSUtils.getInstance().copyFromFile(coordinatorPath, appPath + "/coordinator.xml")
    //先将properties保存到本地.之后再上传.
    props.store(new FileOutputStream(new File(propertiesPath)), "hello")
    HDFSUtils.getInstance().copyFromFile(propertiesPath, appPath + "/job.properties")

    //上传成功,开始启动,创建Oozie客户端对象
    val client = new OozieClient(UpHolder.oozie.url) //传入URL地址
    //启动Oozie作业
    val jobID:String = client.run(props)//传入properties
    println(props)
    println("作业ID:" + jobID)
    //停止作业
//    client.kill(jobID)
  }
}
